# -*- coding: utf-8 -*-

# === CarrierWave補強ライブラリ
# CarrierWave を補強するライブラリです。
# 下記の事柄に対応しています。
#
#   * `resize_to_fit'メソッドなど、画像操作メソッドを利用した際、画像ファイル以外がアップロードできない。
#
# 本ライブラリは画像ファイルのみリサイズするメソッドを追加します。
# 追加するメソッドは`xxx_if_image'になります。
# (xxx は CarrierWave::ImageScience まはた、CarrierWave::RMagick で定義されているクラスメソッド名)
# 使用方法は、今までと同じです。
#
#   vesion :thumb do
#     proccess :resize_to_fit_if_image => [50, 50]
#   end
#
# デフォルトでは JPEG, PNG, GIF画像をリサイズします。
# 上記以外の画像ファイルもリサイズ処理を行わせる場合は、
# image_extension_list を拡張してください。
# See: CarrierWave::Uploader::Configuration
# 
module CarrierWaveExtension

  def self.included(base)
    # Add configure
    # See: CarrierWave::Uploader::Configuration
    base.add_config :image_extension_list
    base.image_extension_list = %w(jpg jpeg gif png)
  
    #
    # Define methods to avoid  occuring errors in image resizing.
    #
    ( if base.included_modules.any?{|m| m.to_s == "CarrierWave::ImageScience"}
        CarrierWave::ImageScience::ClassMethods.instance_methods
      elsif base.included_modules.any?{|m| m.to_s == "CarrierWave::RMagick"}
        CarrierWave::RMagick::ClassMethods.instance_methods
      elsif base.included_modules.any?{|m| m.to_s == "CarrierWave::MiniMagick"}
        CarrierWave::MiniMagick::ClassMethods.instance_methods
      else
        []
      end
    ).each do |name|
      define_method("#{name}_if_image") do |*args|
        extension = file.extension.to_s
        if image_extension_list and image_extension_list.detect { |item| extension =~ /\A#{item}\z/i }
          self.send(name, *args)
        end
      end
    end
  end
end
